#include "Hobbit.h"

#include <iomanip>

#include <boost/assign/list_of.hpp>

using namespace std;
using namespace boost::assign;

const unsigned Hobbit::nbrEnsembles = 3;

const unsigned Hobbit::nbrCapacites = 5;

const unsigned Hobbit::ppAlloues = 35;

const vector< vector< unsigned > > Hobbit::ensembleRacial =
  list_of< vector< unsigned> >
  ( list_of( 1)( 9)( 6)( 3)( 8) ) // costauds
  ( list_of( 1)( 4)( 3)(11)( 8) ) // grand-gars
  ( list_of( 1)( 3)( 8) );        // pieds-velus

const unsigned Hobbit::taille = 11;

/**
 * Contient les capacités, puis les ensembles raciaux, à la fin.
 */
const vector< CapaciteRaciale > Hobbit::Liste = list_of
  (CapaciteRaciale("Bonus à l'attaque"  ,  5))
  (CapaciteRaciale("Bonus à la réaction",  5))
  (CapaciteRaciale("Bonus aux JS"       ,  5))
  (CapaciteRaciale("Camouflage"         , 10))
  (CapaciteRaciale("Détection du mal"   ,  5))
  (CapaciteRaciale("Détection minière"  ,  5))
  (CapaciteRaciale("Dextérité renforcée", 20))
  (CapaciteRaciale("Furtivité"          , 10))
  (CapaciteRaciale("Infravision"        ,  5))
  (CapaciteRaciale("Moquerie"           ,  5))
  (CapaciteRaciale("Portes secrètes"    ,  5));

/**
 * Contient la liste des ensembles raciaux.
 */
const vector< EnsembleCapacitesRaciales > Hobbit::Ensembles = list_of
  ( EnsembleCapacitesRaciales( "Costaud"            , 35, ensembleRacial[0] ) )
  ( EnsembleCapacitesRaciales( "Grand-Gars"         , 35, ensembleRacial[1] ) )
  ( EnsembleCapacitesRaciales( "Pieds-Velus"        , 30, ensembleRacial[2] ) );

const vector< Prerequis > Hobbit::Limites = list_of
  ( Prerequis( 0,  7, 18 ) )
  ( Prerequis( 1,  7, 18 ) )
  ( Prerequis( 2, 10, 18 ) )
  ( Prerequis( 3,  6, 18 ) )
  ( Prerequis( 4,  3, 17 ) );

/**
 * Les Hobbits ont +1 en Dextérité et -1 en Force.
 */
const map< unsigned, int > Hobbit::AjustTraits = map_list_of
  ( 0, -1 )
  ( 1, 1 );

/**
 * Constructeur simplifié, qui remplit simplement le conteneur des capacités.
 * Il est utilisé lors de la lecture d'un fichier XML.
 *
 * @param[in] cap conteneur des capacité
 */
Hobbit::Hobbit(const vector<unsigned>& cap)
  : Race("Hobbit")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  Capacites.assign( cap.begin(), cap.end() );
}

/**
 * Constructeur usuel, qui permet de créer un Hobbit en sélectionnant
 * ses capacités.
 *
 * @param[in] PP nombre de pp, passé en argument afin de pouvoir
 * récupérer les pp non dépensé
 */
Hobbit::Hobbit(unsigned& PP)
  : Race("Hobbit")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  blank() << setfill('*') << setw(56) << '*' << endmsg;
  blank() << "Création d'un hobbit" << endmsg << endmsg;

  PP += 35;
  construitRace( PP );
  
  blank() << endmsg << setfill('*') << setw(56) << '*' << endmsg;
}

Hobbit::Hobbit()
  :Race("Hobbit")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;
}

/**
 * Constructeur de "copie", qui permet de créer une instance à partir
 * de MetaClasse.
 *
 * @param[in] ptr pointeur sur l'instance à copier.
 */
Hobbit::Hobbit(Race *ptr)
  : Race( *ptr )
{}

/**
 * Destructeur, ne fait rien de spécial.
 */
Hobbit::~Hobbit()
{}
